/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.user.dbaccess;

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.NamingException;
import stud.cp.core.dbaccess.DAOException;
import stud.cp.core.dbaccess.JDBC_Connection;

/**
 * Класс, реализующий
 * фабрику DAO классов
 * для доступа к таблицам
 * предметной области.
 * @author Morfant
 */
public class OracleDAOFactory {

    /**
     * Коннект к базе данных для
     * конкретного экземпляра фабрики DAO классов.
     */
    private Connection connection = null;
    /**
     * DAO свойств оружия.
     */
    private PropertiesDAO propertiesDAO = null;
    /**
     * DAO групп свойств оружия
     */
    private PropertyGroupsDAO propertyGroupsDAO = null;
    /**
     * DAO типов свойств
     */
    private PropertyTypesDAO propertyTypesDAO = null;
    /**
     * DAO значений свойств
     */
    private ParametersDAO propertyValueDAO = null;
    /**
     * DAO оружия.
     */
    private ObjectDAO objectDAO = null;
    /**
     * DAO типов оружия.
     */
    private ObjectTypesDAO objectTypesDAO = null;
    /**
     * DAO связующей таблицы типов оружия и свойств оружия.
     */
    private ObjectTypesPropertiesDAO objectTypesPropertiesDAO = null;
    /**
     * DAO ссылочной таблицы.
     */
    private ObjectReferencesDAO objectReferencesDAO = null;
    /**
     * DAO таблицы со списочными значениями.
     */
    private ListValuesDAO propertyListValuesDAO = null;
    /**
     * DAO таблицы, расширящей определение типа свойства.
     */
    private PropertyTypeDefsDAO propertyTypeDefsDAO = null;
    /**
     * DAO типов пользователей.
     */
    private UserTypesDAO userTypesDAO = null;
    /**
     * DAO пользователей.
     */
    private UsersDAO usersDAO = null;
    /**
     * DAO истории.
     */
    private HistoryDAO historyDAO = null;
    /**
     * DAO запросов пользователя.
     */
    private UserQueriesDAO userQueriesDAO=null;

    /**
     * Инициализация фабрики. Обязательно!!!
     * @throws DAOException Ошибка инициализации фабрики..
     * @throws NamingException Ошибка получения данных
     */
    public void initialize() throws DAOException {
        try {
            connection = JDBC_Connection.getConnection();
            propertiesDAO = new PropertiesDAO(connection);
            propertyGroupsDAO = new PropertyGroupsDAO(connection);
            propertyTypesDAO = new PropertyTypesDAO(connection);
            propertyValueDAO = new ParametersDAO(connection);
            objectDAO = new ObjectDAO(connection);
            objectTypesDAO = new ObjectTypesDAO(connection);
            objectTypesPropertiesDAO = new ObjectTypesPropertiesDAO(connection);
            propertyTypeDefsDAO = new PropertyTypeDefsDAO(connection);
            objectReferencesDAO = new ObjectReferencesDAO(connection);
            propertyListValuesDAO = new ListValuesDAO(connection);
            usersDAO = new UsersDAO(connection);
            userTypesDAO = new UserTypesDAO(connection);
            historyDAO = new HistoryDAO(connection);
            userQueriesDAO=new UserQueriesDAO(connection);
        } catch (SQLException er) {
            throw new DAOException("Не удалость инициализировать фабрику.", er);
        }
    }

    /**
     * Деинициализация фабрики. Обязательно!!!
     * @throws DAOException Ошибка деинициализации фабрики.
     */
    public void cleanUp() throws DAOException {
        try {
            if ((connection != null) && (!connection.isClosed())) {
                connection.close();
            }
        } catch (SQLException er) {
            throw new DAOException("Не удалость деинициализовать фабрику.", er);
        }
    }

    /**
     * Получение DAO ObjectTypesDAO.
     * @return ObjectTypesDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public ObjectTypesDAO getObjectTypesDAO() throws DAOException {
        if (objectTypesDAO != null) {
            return objectTypesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertyGroupsDAO.
     * @return PropertyGroupsDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public PropertyGroupsDAO getPropertyGroupsDAO() throws DAOException {
        if (propertyGroupsDAO != null) {
            return propertyGroupsDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertiesDAO.
     * @return PropertiesDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public PropertiesDAO getPropertiesDAO() throws DAOException {
        if (propertiesDAO != null) {
            return propertiesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertyTypesDAO.
     * @return PropertyTypesDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public PropertyTypesDAO getPropertyTypesDAO() throws DAOException {
        if (propertyTypesDAO != null) {
            return propertyTypesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO ObjectTypesPropertiesDAO.
     * @return ObjectTypesPropertiesDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public ObjectTypesPropertiesDAO getObjectTypesPropertiesDAO() throws DAOException {
        if (objectTypesPropertiesDAO != null) {
            return objectTypesPropertiesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO ObjectDAO.
     * @return ObjectDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public ObjectDAO getObjectDAO() throws DAOException {
        if (objectDAO != null) {
            return objectDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertyValueDAO.
     * @return PropertyValueDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public ParametersDAO getParameterDAO() throws DAOException {
        if (propertyValueDAO != null) {
            return propertyValueDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertyValueDAO.
     * @return PropertyValueDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public ListValuesDAO getPropertyListValuesDAO() throws DAOException {
        if (propertyListValuesDAO != null) {
            return propertyListValuesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertyValueDAO.
     * @return PropertyValueDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public PropertyTypeDefsDAO getPropertyTypeDefsDAO() throws DAOException {
        if (propertyTypeDefsDAO != null) {
            return propertyTypeDefsDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO PropertyValueDAO.
     * @return PropertyValueDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public ObjectReferencesDAO getObjectReferencesDAO() throws DAOException {
        if (objectReferencesDAO != null) {
            return objectReferencesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO UsersDAO.
     * @return UsersDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public UsersDAO getUserDAO() throws DAOException {
        if (usersDAO != null) {
            return usersDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO UserTypesDAO.
     * @return UserTypesDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public UserTypesDAO getUserTypesDAO() throws DAOException {
        if (userTypesDAO != null) {
            return userTypesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

    /**
     * Получение DAO HistoryDAO.
     * @return HistoryDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public HistoryDAO getHistoryDAO() throws DAOException {
        if (historyDAO != null) {
            return historyDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }

        /**
     * Получение DAO UserQueriesDAO.
     * @return UserQueriesDAO
     * @throws DAOException
     * <p>
     * Ошибка, возникает либо
     * если фабрика была не проинициализированна
     * </p>
     */
    public UserQueriesDAO getUserQueriesDAO() throws DAOException {
        if (userQueriesDAO != null) {
            return userQueriesDAO;
        }
        throw new DAOException("Фабрика не инициализированна.");
    }
}
